package db;

import com.company.Main;

import java.sql.*;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

public class DBProvider {//封装类

    /**
     * 获取数据库连接
     * @return 数据库连接
     */

    public Connection getConn() {
        //返回值
        Connection connection = null;

        //(0)准备数据库连接的相关参数
        //数据库的驱动类的名字，包，路径名
        String strDriverName4Mysql8 = "com.mysql.cj.jdbc.Driver";
        String strDriverName4Mysql5 = "com.mysql.jdbc.Driver";
        String strDriverName4Oracle = "oracle.jdbc.driver.OracleDriver";

        //数据库服务器的连接串
        //连接串的localhost 127.0.0.1 ip地址，服务器名，表示服务器的访问路径 3306 mysql数据库服务器监听的端口号
        String strURL4Mysql8 = "jdbc:mysql://localhost:3306/tjise2021325?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Hongkong&allowPublicKeyRetrieval=true";
        String strURL4Mysql5 = "jdbc:mysql://localhost:3306/tjise2021325?useUnicode=true&characterEncoding=utf8";
        String strURL4Oracle = "jdbc:oracle:thin:@localhost:1521:orcl";

        //登录数据库的用户名和密码
        String strUserName = "root";
        String strUserPsw = "111111";

        try {
            // (1) 加载数据库驱动类；【使用反射】【可以省略】
            //如果jvm中没有数据库驱动类Driver实例对象，会自动根据连接串类型加载数据库驱动类的实例。
            //Class.forName(strDriverName4Mysql8);这一行可以不用写，jvm会自动加载

            //(2) 通过DriverManager类的静态方法获取数据库的连接对象Connection；
            connection = DriverManager.getConnection(strURL4Mysql5, strUserName, strUserPsw);

        } catch (Exception e) {
            e.printStackTrace();
        }
        return connection;
    }


    /**
     * 查询操作
     *
     * @param strSql 查询语句
     * @return 查询结果集
     */

    public ResultSet query(String strSql) {
        //(3) 通过数据库连接对象获取查询器 Statement ；
        ResultSet resultSet = null;

        try {
            Statement statement = getConn().createStatement();
            // (5) 使用查询器执行SQL语句，如果是查询操作，则会返回一个ResultSet结果集；
            resultSet = statement.executeQuery(strSql);
        }catch (SQLException throwables){
            throwables.printStackTrace();
        }
        return resultSet;
    }

    /**
     * 查询操作
     *
     * List<Map<String,Object>>-----泛型
     *
     * @param strSql 查询语句
     *
     * @return 查询结果集【List+Map】
     */

    public  List<Map<String,Object>> queryListMap(String strSql){
       //返回结果集
        List<Map<String,Object>> list = new ArrayList<>();
        try {
            //(3)通过数据库连接对象获取查询器Statment
            Statement statement = getConn().createStatement();
            // (5) 使用查询器执行SQL语句，如果是查询操作，则会返回一个ResultSet结果集；
            ResultSet resultSet = statement.executeQuery(strSql);

            /////////////////////////////////////////////////////////////////////////////
            System.out.println("///////////数据的转储//List+Map////////////////////");
            //将查询结果集result进行转储，转储到List+Map 的集合中
            if (resultSet!=null){
                //获取结果集中的列的相关信息
                ResultSetMetaData resultSetMetaData =resultSet.getMetaData();
                //获取结果集中的类的个数
                int columCount = resultSetMetaData.getColumnCount();

                //while遍历结果集的行数
                while (resultSet.next()){
                    //每一行用一个Map集合进行保存
                    Map<String,Object> mapRow = new LinkedHashMap<>();//LinkedHashMap--遍历
                    //遍历当前行的列
                    for (int i=1 ;i<=columCount;i++){
                        String strColumName = resultSetMetaData.getColumnName(i);
                        //通过列名获取个列对应的字段值
                        Object objColumValue = resultSet.getObject(strColumName);
                        //将获取的列名，字段值，键值对存入到Map中
                        mapRow.put(strColumName,objColumValue);
                    }
                    //把当前行的Map对象存入List集合中
                    list.add(mapRow);
                }
            }

        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }

        return list;
    }


    /**
     * 新增，修改，删除操作
     *
     * @param strSql 查询语句
     * @param params 占位符的参数
     * @return 数据库操作结果
     *
     */

    public int insertandmodifyanddelete(String strSql,Object... params){
        //返回结果集
        int i = 0 ;
        try{
            PreparedStatement preparedStatement = getConn().prepareStatement(strSql);
            //给PreparedStatement 设置占位符的参数
            if(params != null&&params.length>0){
                //for循环一次设置占位符的值
                for (int j=1;j<=params.length;j++){
                    preparedStatement.setObject(j,params[j-1]);
                }
            }
            //执行正删改查操作
             i = preparedStatement.executeUpdate();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return  i ;
    }

}
